跳到主要内容

异步迭代器

结论:

  • for、for...of、for...await 都可以实现异步迭代,forEach不可以
- for:要使用在async异步方法里,循环会等await执行而停留,await是有效的,有break;
- for of:要使用在async异步方法里,执行期间,await之前的代码会执行,到了await会等待await执行完才继续往下执行,有break;
- for await of:也要用在async异步方法里,有break,但是它一般是使用在item是个异步方法的情况下,并不常见,场景如下面对应的例子,要遍历的数组元素是个异步请求,异步没回来之前整个for循环代码不执行;
- forEach:没有break,循环不会等await执行而停留,await是无效的;

例子:

  • for
//模拟异步代码
function getDatas(times){
times = times || 0
return new Promise((resolve, reject)=>{
setTimeout(()=>{
resolve(times)
}, times*1000)
})
}
let arrays = [1, 2, 3]
async function execute(){
for( let i=0; i<arrays.length; i++ ){
console.log(`${i+1}次我先执行了`)
let datas = await getDatas(arrays[i])
console.log("返回结果:"+datas)
console.log(`${i+1}次执行完了`)
console.log("-------------------------")
}
}
execute()
  • for...of
//模拟异步代码
function getDatas(times){
times = times || 0
return new Promise((resolve, reject)=>{
setTimeout(()=>{
resolve(times)
}, times*1000)
})
}
let arrays = [2, 1, 3]
async function execute(){
let index = 1
for (let item of arrays){
console.log(`${index}次我先执行了`)
let datas = await getDatas(item)
console.log("返回结果:"+datas)
console.log(`${index}次执行完了`)
console.log("-------------------------")
index++
}
}
execute()
  • for...await of
//模拟异步代码
function getDatas(times){
times = times || 0
return new Promise((resolve, reject)=>{
setTimeout(()=>{
resolve(times)
}, times*1000)
})
}
let arrays = [getDatas(0), getDatas(1), getDatas(1.5)]
//一定要在async方法里使用,不能直接写for await (let item of arrays){}执行
async function execute(){
for await (let item of arrays){
console.log(item)
}
}
execute()
  • forEach(无效)
//模拟异步代码
function getDatas(times){
times = times || 0
return new Promise((resolve, reject)=>{
setTimeout(()=>{
resolve(times)
}, times*1000)
})
}
let arrays = [1, 2, 3]
arrays.forEach(async (item, index)=>{
console.log(`${index+1}次开始`)
let datas = await getDatas(item)
console.log("返回结果:"+datas)
console.log(`${item}次结束`)
})